\documentclass[12pt]{ctexart}
\usepackage{algorithm}
\usepackage{algorithmic}
\usepackage[UTF8]{ctex}
\usepackage{amsfonts,amssymb}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{booktabs}
\usepackage{listings}
\usepackage{geometry}
\usepackage[hidelinks]{hyperref}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{setspace}
\usepackage{float}   
\usepackage{svg}
\usepackage{url}
\usepackage{epstopdf}

\geometry{a4paper}
\geometry{top=3cm} 
\geometry{bottom=3.5cm}
\geometry{left=3cm}
\geometry{right=3cm}
\definecolor{mygreen}{rgb}{0,0.6,0}
\definecolor{mygray}{rgb}{0.5,0.5,0.5}
\definecolor{mymauve}{rgb}{0.58,0,0.82}

\usepackage{listings}
\lstset{
 linewidth=1.1\textwidth,
 basicstyle=\small\ttfamily, % 设置字体族
  backgroundcolor=\color[RGB]{245,245,244},
 breaklines=true, % 自动换行
 keywordstyle=\bfseries\color{NavyBlue}, % 设置关键字为粗体，颜色为 NavyBlue
 morekeywords={}, % 设置更多的关键字，用逗号分隔
 emph={self}, % 指定强调词，如果有多个，用逗号隔开
    emphstyle=\bfseries\color{Rhodamine}, % 强调词样式设置
    commentstyle=\itshape\color{black!50!white}, % 设置注释样式，斜体，浅灰色
    stringstyle=\bfseries\color{PineGreen!90!black}, % 设置字符串样式
    columns=flexible,
     tabsize=4,
      escapeinside={\%*}{*)}, 
    numbers=left, % 显示行号在左边
    numbersep=2.5em, % 设置行号的具体位置
    numberstyle=\tiny, % 缩小行号
    frame=single, % 边框
    framesep=1em, % 设置代码与边框的距离
    extendedchars=false, %解决代码跨页时，章节标题，页眉等汉字不显示的问题  
    xleftmargin=2.5em,xrightmargin=2.5em, aboveskip=1em, %设置边距  
    columns=fullflexible,
    captionpos=b,   
}

\title{数学软件-第四次作业}
\author{张志心\\Mixed Class 3210106357}

\begin{document}
\maketitle
\CTEXsetup[format={\Large\bfseries}]{section}

% 1. 阅读附件的
% 30.7 1D Interpolation Example Programs
% 2. 在你的系统里编译并运行该程序；
% 3. 将第18行：
% y[i] = i + cos (i * i); 
% 改为
% y[i] = i + cos (i * i)+3.22010...;   // 加上的部分为你的学号，第一个数字后加小数点。
% 4. 编译运行修改后的程序，生成图片：inter.eps
% 图像生成命令改为：
% graph -T ps < interp.dat > interp.eps
% 这里graph需要安装：
% sudo apt install plotutils
% 5. 将这个例子用中文描述一遍，不用附源代码，但要附你生成的图片，形成文件inter.tex.
% 6. 将c源码，tex，eps文件上传到你的源的目录ass04中。 

\section{1D Interpolation Example Programs}

\subsection{程序功能}

% x[i] = i + 0.5 * sin(i);
% y[i] = i + cos(i * i) + 3.210106357f;

以下程序演示了插值和样条函数的使用。
它计算了一个10点数据集 $(x_i，y_i)$ 的三次样条插值，其中
\[
    x_i = i + \dfrac{\sin(i)}{2} \\
    y_i = i + \cos(i^2) + 3.210106357 \\
    i = 0, \ldots, 9
\]

实现代码如下：

\begin{lstlisting}[language=c]
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_spline.h>

int main(void) {
    int i;
    double xi, yi, x[10], y[10];

    printf("#m=0,S=17\n");

    for(i = 0; i < 10; i++) {
        x[i] = i + 0.5 * sin(i);
        y[i] = i + cos(i * i) + 3.210106357f;
        printf("%g %g\n", x[i], y[i]);
    }

    printf("#m=1,S=0\n");
    
    {
        gsl_interp_accel *acc 
            = gsl_interp_accel_alloc();
        gsl_spline *spline
            = gsl_spline_alloc(gsl_interp_cspline, 10);

        gsl_spline_init(spline, x, y, 10);

        for(xi = x[0]; xi < x[9]; xi += 0.01) {
            yi = gsl_spline_eval(spline, xi, acc);
            printf("%g %g\n", xi, yi);
        }

        gsl_spline_free(spline);
        gsl_interp_accel_free(acc);
    }

    return 0;
}
\end{lstlisting}

\subsection{运行结果}

将程序输出为 \texttt{inter.dat}，然后使用 GNU plotutils 输出图片 \texttt{inter.eps}。
编译运行命令如下：
\begin{verbatim}
    $ gcc -Wall -I/opt/homebrew/include -c inter.c
    $ gcc -L/opt/homebrew/lib inter.o -lgsl -lgslcblas -lm -o inter
    $ ./inter > inter.dat
    $ gnuplot
      gnuplot> set terminal postscript eps enhanced color
      gnuplot> set output "inter.eps"
      gnuplot> plot "inter.dat" with lines
\end{verbatim}

最后输出的图片如下：

\begin{figure}[H]
    \centering
    \includegraphics[width=5in, keepaspectratio]{../assets/inter.eps}
    \caption{1D Interpolation Example}
\end{figure}



\end{document}